{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "1231f824-8565-45d2-8e54-15945661aa0d",
   "metadata": {},
   "source": [
    "Download the [ChatGPT knowledge-graph triplet formatted datasets](https://huggingface.co/datasets/mesolitica/chatgpt-kg-triplets) from Huggingface first if you haven't already. Uncomment and run cell below to download the wikipedia dataset and save it to the current working directory."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "739da681",
   "metadata": {},
   "outputs": [],
   "source": [
    "# !wget https://huggingface.co/datasets/mesolitica/chatgpt-kg-triplets/resolve/main/kg-paragraph-wikipedia.translated.jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "e5075466",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "68f75331",
   "metadata": {},
   "outputs": [],
   "source": [
    "def rebel_format(triplets):\n",
    "    \"\"\"\n",
    "    Convert\n",
    "    [['Bruno Santana', 'participant of', '2004 Summer Olympics'],\n",
    "    ['Bruno Santana', 'participant of', '2008 Summer Olympics'],\n",
    "    ['Bruno Santana', 'country of citizenship', 'Brazil']]\n",
    "    to rebel format,\n",
    "    <triplet> Bruno Santana <subj> 2004 Summer Olympics <obj> participant of <subj> 2008 Summer Olympics <obj> participant of <subj> Brazil <obj> country of citizenship\n",
    "    \"\"\"\n",
    "    q = []\n",
    "    for no, triple in enumerate(triplets):\n",
    "        obj = ['<obj>'] + triple[1].split()\n",
    "        subj = ['<subj>'] + triple[2].split()\n",
    "        if no > 0 and triple[0] == triplets[no - 1][0]:\n",
    "            q.extend(subj + obj)\n",
    "        else:\n",
    "            triplet = ['<triplet>'] + triple[0].split()\n",
    "            q.extend(triplet + subj + obj)\n",
    "    return ' '.join(q)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "3cce8f22",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('kg-paragraph-wikipedia.translated.jsonl') as fopen:\n",
    "    for l in fopen:\n",
    "        data = json.loads(l)\n",
    "        if len(data['paragraph_kg_ms']):  \n",
    "            break"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "459c89e1-e6eb-49f6-a08f-6f265ad855cc",
   "metadata": {},
   "source": [
    "Let's take a look at a sample piece of data before converting it into the rebel format"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "864893e7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Menurut bancian India pada tahun 2001, Remuna memiliki bilangan penduduk seramai 28,958. Dari jumlah tersebut, kaum lelaki membentuk 52% dari jumlah keseluruhan populasi dan wanita seramai 48%. ',\n",
       " [{'head': 'Remuna', 'type': 'populasi', 'tail': '28958'},\n",
       "  {'head': 'Remuna', 'type': 'peratusan_populasi lelaki', 'tail': '52'},\n",
       "  {'head': 'Remuna', 'type': 'peratusan_populasi wanita', 'tail': '48'}]]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data['paragraph_kg_ms'][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "05d5ccc0",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open('processed-kg-wikipedia.jsonl', 'w') as fopen_l:\n",
    "    with open('kg-paragraph-wikipedia.translated.jsonl') as fopen:\n",
    "        for l in fopen:\n",
    "            data = json.loads(l)\n",
    "            for r in data['paragraph_kg_ms']:\n",
    "                text, g = r\n",
    "                if not g:\n",
    "                    continue\n",
    "                triples = []\n",
    "                for t in g:\n",
    "                    if any([t_ is None for t_ in t.values()]):\n",
    "                        continue\n",
    "                    triples.append([t['head'], t['type'], t['tail']])\n",
    "                kg = rebel_format(triples).replace('_', ' ')\n",
    "\n",
    "                d = {\n",
    "                    'text': text.strip(),\n",
    "                    'kg': kg\n",
    "                }\n",
    "                fopen_l.write(f'{json.dumps(d)}\\n')\n",
    "                fopen_l.flush()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "a256a52c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "74318 processed-kg-wikipedia.jsonl\n"
     ]
    }
   ],
   "source": [
    "# Count the number of lines in the converted dataset\n",
    "!wc -l processed-kg-wikipedia.jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "e7127e2d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\"text\": \"Menurut bancian India pada tahun 2001, Remuna memiliki bilangan penduduk seramai 28,958. Dari jumlah tersebut, kaum lelaki membentuk 52% dari jumlah keseluruhan populasi dan wanita seramai 48%.\", \"kg\": \"<triplet> Remuna <subj> 28958 <obj> populasi <subj> 52 <obj> peratusan populasi lelaki <subj> 48 <obj> peratusan populasi wanita\"}\n",
      "{\"text\": \"Menurut bancian India pada tahun 2001 Remuna memiliki kadar pendidikan (kebolehan membaca) 61%, melebihi kadar purata kebangsaan 59.5%; dengan 59% lelaki dan 41% wanita mampu membaca. 14% dari populasi berusia di bawah 6 tahun. (2001)\", \"kg\": \"<triplet> Remuna <subj> 61% <obj> pendidikan <subj> 59.5% <obj> kadar purata kebangsaan <subj> 59% <obj> lelaki mampu membaca <subj> 41% <obj> wanita mampu membaca <subj> 14% <obj> populasi berumur di bawah 6 tahun\"}\n",
      "{\"text\": \"Pencetak baris tanpa hentaman merupakan sejenis pencetak komputer yang menggunakan kaedah laser, elektrostatik atau kaedah pancutan dakwat adalah pencetak yang terlaju dan paling senyap. Pencetak laser Xerox 9700 misalnya, berkeupayaan mencetak lebih daripada 18,000 baris per minit.\", \"kg\": \"<triplet> Pencetak baris tanpa hentaman <subj> pencetak komputer <obj> jenis <subj> laser, elektrostatik, kaedah pancutan dakwat <obj> kaedah <subj> terlaju <obj> kelajuan <subj> paling senyap <obj> kesenyapan <triplet> Pencetak laser Xerox 9700 <subj> lebih daripada 18,000 baris setiap minit <obj> keupayaan untuk mencetak\"}\n"
     ]
    }
   ],
   "source": [
    "!head -n 3 processed-kg-wikipedia.jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "44fdaf2d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{\"text\": \"Wales dan Beesley kemudian melancarkan sebuah syarikat baru, Wikia, yang tidak mempunyai kaitan dengan Wikimedia ataupun Bomis, walaupun ia mendermakan kepada Wikimedia. Kemudiannya, jawatan-jawatan rasmi yang lain dicipta: Tim Starling dilantik sebagai Pegawai Perhubungan Pembangun Perisian untuk membantu memperbaik pembangunan perisian MediaWiki. Daniel Mayer dilantik sebagai Ketua Pegawai Kewangan untuk membantu menyediakan belanjawan serta menyeleraskan kempen-kempen untuk memperoleh derma penubuhan tabung. Erik M\\u00f6ller merupakan Ketua Pegawai Penyelidikan, tetapi beliau meletak jawatan pada Ogos 2005 disebabkan perbezaan pendapat dengan Lembaga. James Forrester kemudian dilantik untuk jawatan itu.\", \"kg\": \"<triplet> Wales dan Beesley <subj> syarikat baru <obj> mengasaskan <triplet> syarikat baru <subj> Wikimedia <obj> tidak mempunyai kaitan dengan <subj> Bomis <obj> tidak mempunyai kaitan dengan <subj> Wikimedia <obj> mendermakan kepada <triplet> Tim Starling <subj> Pegawai Perhubungan Pembangun Perisian <obj> dilantik sebagai <triplet> Pegawai Perhubungan Pembangun Perisian <subj> pembangunan perisian MediaWiki <obj> untuk membantu memperbaik <triplet> Daniel Mayer <subj> Ketua Pegawai Kewangan <obj> dilantik sebagai <triplet> Ketua Pegawai Kewangan <subj> belanjawan serta menyeleraskan kempen-kempen untuk mendapatkan derma penubuhan tabung <obj> untuk membantu menyediakan <triplet> Erik Mller <subj> Ketua Pegawai Penyelidikan <obj> adalah <subj> Ogos 2005 <obj> meletak jawatan pada <triplet> James Forrester <subj> Ketua Pegawai Penyelidikan <obj> dilantik sebagai\"}\n",
      "{\"text\": \"Melvil Dewey (1851-1931) merupakan pelopor atau individu yang bertanggungjawab mencipta DDC untuk buku pada 1876. Melvil Dewey atau nama sebenarnya Melville Louis Kossuth Dewey dilahirkan pada 10 Disember 1851 di sebuah bandar kecil di utara New York. Beliau merupakan anak bongsu daripada lima orang adik-beradik. Sewaktu kecil, beliau gemar menyusun barang-barangnya dan seorang yang bijak dalam matematik. Beliau melanjutkan pelajaran di Kolej Amherst dan mengambil upah dengan bekerja sambilan di perpustakaan kolej terbabit untuk membayar yuran pelajarannya. Dengan bakat matematiknya dan sifatnya yang gemar melihat barang-barang tersusun, beliau mencipta sistem pengelasan yang diberi nama bersemperna namanya \\u201cPengelasan Perpuluhan Dewey\\u201d yang mana buku-buku di perpustakaan tempatnya bekerja disusun mengikut subjek utama dan digunakan pada 1873. Tiga tahun kemudian (1876), DCC mula diperkenalkan ke luar Perpustakaan Kolej Amherst.\", \"kg\": \"<triplet> Melvil Dewey <subj> pencipta DDC (Dewey Decimal Classification) <obj> dikenali sebagai <subj> 10 Disember 1851 <obj> dilahirkan di <subj> sebuah bandar kecil di utara New York <obj> dilahirkan di <subj> di kalangan lima adik beradik <obj> ialah anak bongsu <subj> sejak kecil <obj> ialah seorang ahli matematik berbakat <subj> Kolej Amherst <obj> menghadiri <subj> di perpustakaan kolej untuk membayar pendidikannya <obj> bekerja sambilan <subj> sistem Dewey Decimal Classification (DDC) <obj> mencipta <subj> pada tahun 1876 <obj> memperkenalkan DDC\"}\n",
      "{\"text\": \"Paya Bili I merupakan sebuah gampong yang terletak di kecamatan Birem Bayeun, Kabupaten Aceh Timur, provinsi Aceh, Indonesia.\", \"kg\": \"<triplet> Paya Bili I <subj> kecamatan Birem Bayeun <obj> terletak di <subj> Kabupaten Aceh Timur <obj> terletak di <subj> provinsi Aceh <obj> terletak di <subj> Indonesia <obj> terletak di\"}\n"
     ]
    }
   ],
   "source": [
    "!tail -n 3 processed-kg-wikipedia.jsonl"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c5682a5c-a6a3-4d00-a53a-6c69a8f045d5",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
